﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entidades;
using Logica;
using Logica.Comandos.Lugar;
using Logica.Fabricas;
using SchadenEscritorio.Contratos;
using SchadenEscritorio.Contratos.ContratosBase;

namespace SchadenEscritorio.Presentadores
{
    /// <summary>
    /// presentador de la vista AgregarLugar
    /// </summary>
    public class PresentadorLugar
    {
        #region Atributos

        private IContratoLugar _vista;

        #endregion

        public PresentadorLugar ( IContratoLugar vista)
        {
            _vista = vista;
        }

        public PresentadorLugar()
        {
        }

        #region Encapuslamiento

        public IContratoLugar Vista
        {
            get { return _vista; }
            set { _vista = value; }
        }
        #endregion

        #region Metodos

        /// <summary>
        /// metodo que llena el combobox con los datos de los estados
        /// </summary>
        public void CargarEstados()
        {
            Lugar prueba = FabricaEntidades.ObtenerLugar();
            Comando miComando = FComandoLugar.ObtenerEstados();
            List<Object> lista = ((ComandoObtenerEstados)miComando).Ejecutar(prueba);
            foreach (Lugar lugar in lista)
            {
                _vista.Estado.Items.Add(lugar);
            }
            _vista.Estado.DisplayMember = "Nombre";
            _vista.Estado.ValueMember = "Id";
        }

        /// <summary>
        /// carga todas las ciudades en combobox dado un estado
        /// </summary>
        public void CargarCiudades()
        {

            if (_vista.Estado.SelectedIndex != -1)
            {
                Comando comando = FComandoLugar.ObtenerCiudad();
                List<Object> lista = ((ComandoObtenerCiudad)comando).Ejecutar((Lugar)_vista.Estado.SelectedItem);
                _vista.Ciudad.Items.Clear();
                foreach (var lugar in lista)
                {
                    _vista.Ciudad.Items.Add(lugar);

                }
                _vista.Ciudad.DisplayMember = "Nombre";
                _vista.Ciudad.ValueMember = "Id";
            }
        }

        /// <summary>
        /// metodo que se encarga de cargar todas las urbanizaciones dado una ciudad
        /// </summary>
        public void CargarUrbanizaciones()
        {
            if  (_vista.Ciudad.SelectedIndex != -1)
            {
                Comando comando = FComandoLugar.ObtenerCiudad();
                List<Object> lista = ((ComandoObtenerCiudad)comando).Ejecutar((Lugar)_vista.Ciudad.SelectedItem);
                _vista.Urbanizacion.Items.Clear();
                foreach (var lugar in lista)
                {
                    _vista.Urbanizacion.Items.Add(lugar);

                }
                _vista.Urbanizacion.DisplayMember = "Nombre";
                _vista.Urbanizacion.ValueMember = "Id";
            }
        }

        /// <summary>
        /// metodo que se encarga de cargar todas las avenidas o calles dado una urbanizacion
        /// </summary>
        public void CargarAvenidas()
        {
            if (_vista.Urbanizacion.SelectedIndex != -1)
            {
                Comando comando = FComandoLugar.ObtenerCiudad();
                List<Object> lista = ((ComandoObtenerCiudad)comando).Ejecutar((Lugar)_vista.Urbanizacion.SelectedItem);
                _vista.Calle.Items.Clear();
                foreach (var lugar in lista)
                {
                    _vista.Calle.Items.Add(lugar);

                }
                _vista.Calle.DisplayMember = "Nombre";
                _vista.Calle.ValueMember = "Id";
            }
        }

        /// <summary>
        /// metodo que recolecta los datos del formulario y los almacena 
        /// </summary>
        public Lugar ObtenerLugar()
        {
            Lugar estado = FabricaEntidades.ObtenerLugar();
            Lugar ciudad = FabricaEntidades.ObtenerLugar();
            Lugar urbanizacion = FabricaEntidades.ObtenerLugar();
            Lugar calle = FabricaEntidades.ObtenerLugar();
            Lugar casa = FabricaEntidades.ObtenerLugar();
            Lugar piso = FabricaEntidades.ObtenerLugar();

            if (_vista.Estado.SelectedIndex != -1)
            {
                estado = (Lugar)_vista.Estado.SelectedItem;
            }
            else
            {
                estado.Id = -1;
                estado.Nombre = _vista.Estado.Text.ToLower();
                estado.Tipo = "ciudad";
            }
            if (_vista.Ciudad.SelectedIndex != -1)
            {
                ciudad = (Lugar)_vista.Ciudad.SelectedItem;
            }
            else
            {
                ciudad.Id = -1;
                ciudad.Nombre = _vista.Ciudad.Text.ToLower();
                ciudad.Tipo = "urbanizacion";
            }
            if (_vista.Urbanizacion.SelectedIndex != -1)
            {
                urbanizacion = (Lugar)_vista.Urbanizacion.SelectedItem;
            }
            else
            {
                urbanizacion.Id = -1;
                urbanizacion.Nombre = _vista.Urbanizacion.Text.ToLower();
                urbanizacion.Tipo = "urbanizacion";
            }
            if (_vista.Calle.SelectedIndex != -1)
            {
                calle = (Lugar)_vista.Calle.SelectedItem;
            }
            else
            {
                calle.Id = -1;
                calle.Nombre = _vista.Calle.Text.ToLower();
                calle.Tipo = "tipo";
            }

            casa.Nombre = _vista.Edificio.Text.ToLower();
            casa.Tipo = "edificio";
            piso.Nombre = _vista.Piso.Text.ToLower();
            piso.Tipo = "piso";

            estado.Descendiente = ciudad;
            ciudad.Descendiente = urbanizacion;
            urbanizacion.Descendiente = calle;
            calle.Descendiente = casa;
            casa.Descendiente = piso;
            piso.Descendiente = null;
            return estado;
        }

        /// <summary>
        /// Dado un Lugar rellena el formulario dado
        /// </summary>
        /// <param name="lugarSet"></param>
        public void SetLugar(Lugar lugarSet)
        {
            CargarEstados();
            _vista.Estado.SelectedItem = lugarSet;
            _vista.Ciudad.SelectedItem = lugarSet.Descendiente;
            _vista.Urbanizacion.SelectedItem = lugarSet.Descendiente.Descendiente;
            _vista.Calle.SelectedItem = lugarSet.Descendiente.Descendiente.Descendiente;
            _vista.Edificio.Text = 
                    lugarSet.Descendiente.Descendiente.Descendiente.Descendiente.Nombre;
            _vista.Piso.Text =
                lugarSet.Descendiente.Descendiente.Descendiente.Descendiente.Descendiente.Nombre;
        }
        #endregion
       
    }
}
